# Python 枚举类

# 枚举类是一种特殊的类，它定义了一组命名常量，每个常量都有唯一的数值。枚举类可以用来代替整数常量，使代码更易读、更易维护。


from enum import Enum, unique


# 定义枚举类
# 使用 @unique 装饰器可以检查是否有重复值的成员值,如果有则会抛出 ValueError 异常
@unique
class Color(Enum):
    # 定义枚举类成员, 成员名称 = 成员值, 成员名称必须是全大写且不能重复
    RED = 1
    GREEN = 2
    BLUE = 3

    # 定义两个相同值的成员
    # A = 4
    # B = 4


# 枚举类可以像普通类一样实例化，并访问其成员：
color1 = Color.RED
print(type(color1)) # <enum 'Color'>
print("枚举实例：", color1)  # Color.RED
print("枚举名称：", color1.name)  # RED
print("枚举值：", color1.value)  # 1
# 通过 __members__ 属性可以获取所有枚举成员的字典：
print(list(Color.__members__.items()))


# 枚举类可以被迭代，并返回每个成员的名称和值：
for name, member in Color.__members__.items():
    print(name, '=>', member.value, '=>', member)



# 枚举类可以被作为字典使用，并返回每个成员的名称和值：
# 通过成员名称获取枚举成员
print(Color['RED'])  # Color.RED
# 通过成员值获取枚举成员
print(Color(1))  # Color.RED
# 在通过值获取成员时，如果有多个相同值的成员，则返回第一个匹配的成员
# print(Color(4))  # Color.A

# 枚举值比较
print(Color.RED == 1)  # False
print(Color.RED.value == 1)  # True
print(Color.RED == Color.GREEN)  # False
print(Color.RED == Color.RED)  # True


# 枚举类可以被继承，并添加新的成员：
# class Shape(Enum):
#     CIRCLE = 1
#     SQUARE = 2
#     TRIANGLE = 3
#
# class Rectangle(Shape):
#     WIDTH = 5
#     HEIGHT = 6
#
# print(list(Rectangle.__members__.items()))